#pragma once
#include "Log.hpp"
#include <iostream>
#include <functional>
#include <cassert>
#include <pthread.h>

typedef void *(*func_t)(void *);  // 类型重定义

struct ThreadData
{
    std::string _name;
    void *_args;

    ThreadData(const std::string& name, void *args)
        : _name(name), _args(args)
    { }
};

class Thread
{
public:
    Thread(const std::string& name, func_t func, void *args)
        : _func(func), _thread_data(ThreadData(name, args))
    { }

    // 线程启动函数
    void start()
    {
        int n = pthread_create(&_id, nullptr, _func, (void *)&_thread_data);
        assert(n == 0);
        (void)n;
    }

    ~Thread()
    {
        pthread_join(_id, nullptr);
    }

private:
    pthread_t _id;   // 线程id
    func_t _func;    // 线程函数
    ThreadData _thread_data;   // 线程数据
};